#include"../logs/bitlog.h"
#include<chrono>

void bench(const std::string &logger_name,size_t thr_count,size_t msg_count,size_t msg_len){
    //1.
    bitlog::Logger::ptr logger=bitlog::getLogger(logger_name);
    if(logger.get()==nullptr){
        return ;
    }
    //2.
    std::cout<<"测试日志："<<msg_count<<"条，总大小:"<<(msg_count*msg_len)/1024<<"KB\n";
    std::string msg(msg_len-1,'A');//-1是为了给末尾加\n

    std::vector<std::thread> threads;
    std::vector<double> cost_arry(thr_count);
    size_t msg_per_thr=msg_count/thr_count;
    for(int i=0;i<thr_count;i++)
    {
        threads.emplace_back([&,i](){
            auto start=std::chrono::high_resolution_clock::now();
            for(int j=0;j<msg_per_thr;j++)
            {
                logger->fatal("%s",msg.c_str());
            }
            auto end=std::chrono::high_resolution_clock::now();
            std::chrono::duration<double> cost=end-start;
            cost_arry[i]=cost.count();
            std::cout<<"\t线程"<<i<<":"<<"\t输出日志数量:"<<msg_per_thr<<",耗时:"<<cost.count()<<std::endl;
        });
    }
    for(int i=0;i<thr_count;i++)
    {
        threads[i].join();
    }

    double max_cost=cost_arry[0];
    for(int i=0;i<thr_count;i++)
    {
        max_cost=max_cost<cost_arry[i]?cost_arry[i]:max_cost;
    }
    size_t msg_per_sec=msg_count/max_cost;//每秒的数量
    size_t size_per_sec=(msg_count*msg_len)/(max_cost*1024);//以kb为单位每秒多大
    std::cout<<"\t总耗时:"<<max_cost<<"s\n";
    std::cout<<"\t每秒输出日志数量:"<<msg_per_sec<<"条\n";
    std::cout<<"\t每秒输出日志大小:"<<size_per_sec<<"KB\n";

}

void sync_bench(){
     std::unique_ptr<bitlog::LoggerBuilder> builder(new bitlog::GlobalLoggerBuilder());
    builder->buildLoggerName("sync_logger");
    builder->buildFormatter("%m%n");
    builder->buildLoggerType(bitlog::LoggerType::LOGGER_SYNC);
    builder->buildSink<bitlog::FileSink>("./logfile/sync.log");
    builder->build();
    bench("sync_logger",3,1000000,100);
}
void async_bench()
{
    std::unique_ptr<bitlog::LoggerBuilder> builder(new bitlog::GlobalLoggerBuilder());
    builder->buildLoggerName("async_logger");
    builder->buildFormatter("%m%n");
    builder->buildLoggerType(bitlog::LoggerType::LOGGER_ASYNC);
    builder->buildEnableUnSafeAsync();//开启非安全模式--主要是为了将实际落地时间排除在外
    builder->buildSink<bitlog::FileSink>("./logfile/async.log");
    builder->build();
    bench("async_logger",5,1000000,100);
}

int main()
{
    async_bench();
    return 0;
}